// 本案例为settimer函数的应用实例
// 应用代码每隔1秒便会调用信号处理函数signalDeal打印当前系统的时间和日期，
// 在该函数中，使用了另外两个喊叔叔:gettimeofday 和 localtime函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>

// 这是对信号的处理函数
static void signalDeal(int signo){
	
	struct timeval tp;
	struct tm *tm;

	// 定义一个时间结构体变量
	time_t timetemp;

	// 使用gettimeofday函数获得当前时间和日期
	gettimeofday(&tp, NULL);
	
	// 获取时间参数
	time(&timetemp);
	// 获得当前时间和日期
	tm = localtime(&timetemp);
	//tm = localtime(&tp.tv_sec);

	printf(" sec  = %ld\t", tp.tv_sec);	// 打印从UNIX纪元开始到现在的秒数
	printf(" usec = %ld\n", tp.tv_usec);	// 打印微秒

	// 打印当前时间和日期
	printf("%d-%d-%d  %d:%d:%d\n", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
}

// 时间函数初始化
static void InitTime(int tv_sec, int tv_usec){
	
	// 定义时间参数结构体value
	struct itimerval value;

	// 注册信号SIGALRM和信号处理函数
	signal(SIGALRM, signalDeal);

	// it_value表示计时器安装后首次启动的初始值
	// it_interval表示计数器重新启动的间隔值
	value.it_value.tv_sec = tv_sec;
	value.it_value.tv_usec = tv_usec;

	value.it_interval.tv_sec = tv_sec;
	value.it_interval.tv_usec = tv_usec;

	// 使用setitimer函数实现精确定时,定时类型为ITIMER_REAL(设定绝对时间，即系统的时间)
	setitimer(ITIMER_REAL, &value, NULL);
}

int main(){
	// 每隔1秒打印一次
	InitTime(1,0);

	while(1){ }

	exit(0);
}

